<?php
/**
 * MyValidator.class.php
 * 
 * (C) 2009, tetsuya.odaka(EzoGP).
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* 
 * 入力検証用Class
 * 
 * author；		t.odaka
 * date;		2009/4/17
 * 
*/

class MyValidator {

	/* 
	 * プロパティー
	 *  
	*/

    /*
     * 検証コンポーネント識別子＆メッセージテーブル（英語）
     * 		必要に応じて利用時に書き換えてください。
     */
    var $_valMsg = array(
    	"isRequired"	=> "required",
    	"isAlpha"		=> "alphabetic characters only",
    	"isCapAlpha" 	=> "capital alphabetic characters only",
        "isNum" 		=> "number only.",
        "isAlphaNum" 	=> "alphanumeric characters only",
        "isDate" 		=> "invalid date format. yyyy/mm/dd only.",
        "isEmail" 		=> "invalid e-mail format.",
        "isPhone" 		=> "invalid phone format",
        "isInteger" 	=> "integer only.",
        "isZip" 		=> "invalid zip format. 123-4567 or 1234567.",
        // 以下は、return用のみメッセージ
        "falseUse" 		=> "invalid call"
    );

    /*
     * 検証コンポーネント識別子＆メッセージテーブル（日本語）
     * 		必要に応じて利用時に書き換えてください。
     *      
     */
    var $_valMsgJp = array(
    	"isRequired" 	=> "入力必須です.",
    	"isAlpha" 		=> "アルファベットでなくてはいけません.",
    	"isCapAlpha" 	=> "アルファベット（大文字）でなくてはいけません.",
        "isNum" 		=> "数値でなくてはいけません.",
        "isAlphaNum" 	=> "英数文字でなくてはいけません.",
        "isDate" 		=> "日付（yyyy/mm/dd）が正しくありません.",
        "isEmail" 		=> "メイルアドレスの形式が正しくありません.",
        "isPhone" 		=> "電話番号の形式が正しくありません.",
        "isInteger" 	=> "整数でなくてはいけません.",
        "isZip" 		=> "郵便番号の形式（123-4567,1234567）が正しくありません.",
        "isHiragana" 	=> "ひらがなで入力してください.",
        "isKatakana" 	=> "カタカナで入力してください.",
        // 以下は、return用のみメッセージ
        "falseUse" 		=> "システムエラー；呼び出しが誤っています."
    );
    
    /*
     * 検証コンポーネント正規表現テーブル
     * 		必要に応じて利用時に書き換えてください。
     */
    var $_valRex = array(
    	"isRequired" => "/[^.*]/", // key（isRequired）だけ使う
       	"isAlpha" => "/^[a-z\s\._-]+$/i",
       	"isCapAlpha" => "/^[A-Z\s\._-]+$/",
        "isNum" => "/^[-+]?\d*\.?\d+$/",
        "isAlphaNum" => "/^[a-z0-9\s\._-]+$/i",
        "isDate" => "/^\d{4}\/(\d{1}|\d{2})\/(\d{1}|\d{2})/", // yyyy/mm/dd
        "isEmail" => "/^[a-z0-9\._%-]+@[a-z0-9\.-]+\.[a-z]{2,4}$/i",
        "isPhone" => "/^[\d\s()-]+$/",
        "isInteger" => "/^[-+]?\d+$/",
        "isZip" => "/^\d{3}-?\d{4}$/",
        "isHiragana" => "/^[あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽヴぁぃぅぇぉゃゅょっ　]+$/u",
        "isKatakana" => "/^[アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴァィゥｪｫャｭョッ　]+$/u"
	);
        
    /* 
	 * デフォルトのコンストラクタ 
	 */
	function __construct() {
	}

    /* 
	 * 検証メソッド
	 *   パラメータ
	 *   $_locale	:	クライアントのロケール（jaと以外を想定） 
	 *   $_opt		:	検証の種類（isRequiredなど）
	 * 	 $_str		:   検証する文字列
	 */
	function validate($_locale, $_opt, $_str){
		// debug用
		require("../Myznala/debugLog.php");
		// リクエストからlocaleを取り出す。
		//$_wkLocale 
		//	= substr(strtolower($_REQUEST['locale']),0,2);
			
		if($_locale == 'ja'){
			$_mArray = &$this->_valMsgJp;
		}else{
			$_mArray = &$this->_valMsg;
		}
		
		$_ret = "";
		if($_opt == "isRequired"){
			$_ret = $this->isReq($_str, &$_mArray);
		}else{
//				$myDebugLog->debug("opt: ".$_opt);
				
				if (array_key_exists($_opt, $this->_valRex)) {
//				$myDebugLog->debug("regExp");
				$_ret = $this->pregCheck($_opt, $_str, &$_mArray);
			}
		}
		
		return $_ret;
	}

	/* 
	 * 入力必須のチェック
	 *   検証の種類が(isRequired)の場合
	 *   パラメータ
	 * 	 $_str		:   検証する文字列
	 *   $_mArray   :	localeに対応したメッセージテーブルの参照
	 * 
	 */
	function isReq($_str, $_mArray){
		if($_str==null || strlen($_str)==0){
			return 	$_mArray["isRequired"];		
		}
		return "";
	}
	
	/*
	 * 正規表現でチェック 
	 *   パラメータ
	 *   $_opt		:	検証の種類（isAlphaなど）
	 * 	 $_str		:   検証する文字列
	 *   $_mArray   :	localeに対応したメッセージテーブルの参照
	 */
	function pregCheck($_opt, $_str, $_mArray){
		// debug用
		require("../Myznala/debugLog.php");

//		$myDebugLog->debug("opt: ".$_opt);
//		$myDebugLog->debug("str: ".$_str);
		
		mb_regex_encoding('UTF-8');
		$_retArray = preg_match($this->_valRex[$_opt],$_str);
		
//		$myDebugLog->debug("retArray.length: ".$_retArray.length);
		if($_retArray.length==0){
			return 	$_mArray[$_opt];		
		}
		return "";
	}
	
	/*
	 * 特定のエラーメッセージの取得 
	 *   パラメータ
	 *   $_locale	:	クライアントのロケール（jaと以外を想定） 
	 *   $_opt		:	検証の種類（isRequiredなど）
	 * 	 
	 */
	function getMessage($_locale, $_opt){
		// debug用
		require("../Myznala/debugLog.php");
//		$myDebugLog->debug("getMessage_locale: ".$_locale);
//		$myDebugLog->debug("getMessage_opt: ".$_opt);
		
		if($_locale == 'ja'){
			$_mArray = &$this->_valMsgJp;
		}else{
			$_mArray = &$this->_valMsg;
		}
		
		if(array_key_exists($_opt,$_mArray)){
			return $_mArray[$_opt];
		}
		return 'wrong key';
	}

}
?>